/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findMedianSortedArrays = function (nums1, nums2) {
    /**
     * 
     * @param {number[]} nums1 
     * @param {number[]} nums2 
     * @param {number} offset1 
     * @param {number} offset2 
     */
    function recursion(nums1, nums2, k, offset1 = 0, offset2 = 0) {
        // console.log(`${k} ${offset1} ${offset2}`)
        if (nums1.length - offset1 === 0) {
            return nums2[offset2 + k - 1];
        }
        if (nums2.length - offset2 === 0) {
            return nums1[offset1 + k - 1];
        }
        if (k === 1) {
            return Math.min(nums1[offset1], nums2[offset2]);
        }
        const i = Math.floor(k / 2);
        // console.log(i)
        let i1 = i + offset1, i2 = i + offset2;
        if (i1 > nums1.length) {
            i1 = nums1.length;
        } else if (i2 > nums2.length) {
            i2 = nums2.length;
        }
        if (nums1[i1 - 1] < nums2[i2 - 1]) {
            k = k - (i1 - offset1);
            offset1 = i1;
        } else {
            k = k - (i2 - offset2);
            offset2 = i2;
        }
        return recursion(nums1, nums2, k, offset1, offset2);
    }

    const sum = nums1.length + nums2.length;
    if (sum % 2 === 1) {
        return recursion(nums1, nums2, Math.floor(sum / 2) + 1);
    } else {
        return (recursion(nums1, nums2, sum / 2) + recursion(nums1, nums2, sum / 2 + 1)) / 2
    }
};

// const test = function(nums1, nums2, rs) {
//     const a = findMedianSortedArrays(nums1, nums2);
//     if (a === rs) {
//         console.log("success");
//     } else {
//         console.log(`failure: ${a} / ${rs}`);
//     }
// }

// test([1, 3], [2], 2);
// test([1, 2], [3, 4], 2.5);
// test([0, 0], [0, 0], 0);
// test([], [1], 1);
// test([2], [], 2);